"""
宿舍电费公平分摊
这个月的宿舍电费花了500元，宿舍有10个人，大家要凑够100元来缴纳这个电费。
为了公平起见，按照每个人的用电器功率和每天用电时间计算比率。
设计一个程序，让大家输入自己的用电器功率（有1到多个电器）以及对应的平均每天使用时间，结束一个人输入后打印该同学的用电总功率，
最后按比率计算每个人应出多少钱。

提示：
1. 你可以使用一个循环来收集每个室友的用电信息。每次循环中，再使用一个子循环来收集该室友的所有用电器的功率和使用时间，当捕获到非用电信息时（即非数字）结束循环。
2. 用电总功耗可以通过功率乘以使用时间得到。所有室友的用电总功耗之和就是宿舍的总功耗。
3. 每个室友应缴纳的电费 = (该室友的总功耗 / 宿舍的总功耗) * 100元。
"""
def collect_user_power():
    """收集单个用户的用电信息"""
    # 初始化变量：total_power记录总功率，device_count记录电器数量
    total_power = 0
    device_count = 1

    print("\n请输入您的用电器信息（输入非数字结束）：")
    # 使用无限循环来收集用户输入，直到用户输入非数字为止
    while True:
        try:
            # 使用 f-string 格式化字符串，提示用户输入第几个电器的信息
            power = float(input(f"请输入第{device_count}个电器的功率(瓦特)："))
            hours = float(input(f"请输入第{device_count}个电器每天使用时间(小时)："))

            # 计算单个电器的每日耗电量（功率 × 时间）
            daily_power = power * hours
            # 累加到总功率中
            total_power += daily_power
            # 电器计数加1
            device_count += 1

        except ValueError:
            # 当输入非数字时，ValueError异常会被捕获，跳出循环
            break

    return total_power


def calculate_fees(total_power_list):
    """计算每个人应付的费用"""
    # 计算宿舍总功耗
    total_dorm_power = sum(total_power_list)
    # 创建列表存储每个人应付的费用
    fee_per_person = []

    # 遍历每个人的功耗，计算应付费用
    for power in total_power_list:
        # 计算每个人的用电占比
        ratio = power / total_dorm_power
        # 根据占比计算应付金额（总费用100元），保留2位小数
        fee = round(ratio * 100, 2)
        # 将计算结果添加到费用列表中
        fee_per_person.append(fee)

    return fee_per_person


def main():
    # 打印程序标题和分隔线
    print("宿舍电费分摊计算程序")
    print("=" * 30)

    # 创建列表存储所有人的用电量
    total_power_list = []

    # 循环10次收集10个人的用电信息
    for i in range(10):
        print(f"\n正在录入第{i + 1}号室友的信息")
        # 调用collect_user_power()收集单个用户的用电信息
        power = collect_user_power()
        # 将用电量添加到列表中
        total_power_list.append(power)
        # 打印该用户的总用电量
        print(f"第{i + 1}号室友的每日总用电量为：{power:.2f}瓦特时")

    # 调用calculate_fees()计算每个人的费用
    fees = calculate_fees(total_power_list)

    # 打印最终分摊结果
    print("\n最终分摊结果：")
    print("=" * 30)
    # 使用enumerate同时获取索引和费用值
    for i, fee in enumerate(fees):
        print(f"第{i + 1}号室友应付：{fee}元")

    # 验证所有人的费用总和是否为100元
    print(f"\n费用总和：{sum(fees):.2f}元")


# 程序入口点，确保只有直接运行此文件时才执行main()
if __name__ == "__main__":
    main()
